package main

import (
	"fmt"
	"reflect"
	"unsafe"
)

//应用场景1：访问私有变量
//使用 reflect.ValueOf(p) 获取 Person 实例的 reflect.Value。
//使用 v.Elem().FieldByName("name") 和 v.Elem().FieldByName("age") 获取 name 和 age 字段的 reflect.Value。
//使用 reflect.NewAt() 和 unsafe.Pointer() 将 reflect.Value 转换为对应的原始类型,并使用 Elem().Interface() 获取值。
//最后将值转换为所需的类型 (string 和 int) 并打印出来。

type Person struct {
	name string
	age  int
}

func main() {
	p := &Person{name: "Alice", age: 30}
	// 使用反射访问私有成员
	v := reflect.ValueOf(p)
	nameField := v.Elem().FieldByName("name")
	ageField := v.Elem().FieldByName("age")
	// 需要通过 reflect的安全 API 来访问私有字段
	name := reflect.NewAt(nameField.Type(), unsafe.Pointer(nameField.UnsafeAddr())).Elem().Interface().(string)
	age := reflect.NewAt(ageField.Type(), unsafe.Pointer(ageField.UnsafeAddr())).Elem().Interface().(int)

	fmt.Printf("Name: %s, Age: %d\n", name, age)
}
